from pyramid.response import Response
from pyramid.renderers import render
import json
import re
from pyramid.httpexceptions import HTTPFound, HTTPNotFound
from pyramid.security import authenticated_userid
from sqlalchemy import and_
from sqlalchemy import or_
#from sqlalchemy import in_
from alpha.modelos import DBSession
from alpha.modelos.models import Usuario
from alpha.modelos.models import Rol
from alpha.modelos.models import Proyecto
from alpha.modelos.models import Permiso
from alpha.modelos.models import Item
from alpha.modelos.models import RelacionSucesor
from alpha.modelos.models import RelacionHijo
from alpha.modelos.models import AsociacionRolPermiso
from alpha.modelos.models import AsociacionUsuarioRol
from alpha.modelos.models import AsociacionFaseTipoItem
from alpha.modelos.models import AsociacionRolProyecto
from alpha.modelos.models import AsociacionRolFase
from alpha.modelos.models import AsociacionRolTipoItem
from alpha.modelos.models import TipoItem
from alpha.modelos.models import Historial
from alpha.modelos.models import Atributo
from alpha.modelos.models import Fase
from alpha.modelos.models import compara
from alpha.modelos.models import comparaFase
import transaction


import sys
sys.path.append('..')
sys.path.append('/usr/lib/graphviz/python/')
sys.path.append('/usr/lib64/graphviz/python/')
#import gv
import pygraphviz as pgv


def grafo_proyecto(request):
	session = DBSession()
	lista= []
	idProyecto = int(request.matchdict['idProyecto'])
	proyecto= session.query(Proyecto).filter_by(id = idProyecto).first()
	##
	# eje x
	proyecto.fases.sort(comparaFase)# imprescindible soluciona lo del desorden de sqlalchemy
	desplazamiento_x = {}
	__index = 0
	for i in proyecto.fases:
		desplazamiento_x[i.id] = __index
		__index+=1
	# eje y
	desplazamiento_y = []
	for i in range(len(proyecto.fases)):
		desplazamiento_y.append(0)
	
	#####
	gr = pgv.AGraph(directed=True, label="azul= bloqueado : verde= aprobado : amarillo= revision : rojo= desaprobado")
	#gr.node_attr['shape']='circle'
	nodos= []
	id_nodos= []
	#proyecto.fases.sort(comparaFase)
	for fas in proyecto.fases:
		fas.items.sort(compara)
		for nodo in fas.items:
			print "\n\n\n"
			print nodo.getNombre()
			print "\n\n\n"
			if nodo.getEstado() != 'Eliminado':
				id_nodos.append(nodo.id)
				nodos.append(nodo)
	
	for nodo in nodos:
		item = nodo
		valor = str(item.id)+" : "+str(item.getComplejidad())
		index = desplazamiento_x[item.fase_id]
		posicion =  str(index*3.5)+','+str(90-desplazamiento_y[index]*2)
		desplazamiento_y[index] = desplazamiento_y[index] + 1
		if item.getEstado() == 'Desaprobado':
			color= '#D43D1A'
		elif item.getEstado() == 'Aprobado':
			color= '#8dad48'
		elif item.getEstado() == 'Bloqueado':
			color= '#008ee8'
		elif item.getEstado() == 'Revision':
			color= '#FCD116'
		gr.add_node(valor, label= item.getNombre()+" : "+  str(item.getComplejidad()), fillcolor=color, style="filled", pos=posicion, pin=True)
	#relaciones son aristas
	#relaciones antecesor-sucesor
	aristas = session.query(RelacionSucesor).filter(RelacionSucesor.left_id.in_(id_nodos)).filter(RelacionSucesor.right_id.in_(id_nodos)).all()
	# relaciones padre-hijo
	aristasAdd= session.query(RelacionHijo).filter(RelacionHijo.left_id.in_(id_nodos)).filter(RelacionHijo.right_id.in_(id_nodos)).all()
	#concatena todas las relaciones
	aristas.extend(aristasAdd)
	for arista in aristas:
		if(gr.has_edge((arista.left_id, arista.right_id))==False):
			item1 = item = DBSession.query(Item).get(arista.left_id)
			item2 = item = DBSession.query(Item).get(arista.right_id)
			valor1 = str(item1.id)+" : "+str(item1.getComplejidad())
			valor2 = str(item2.id)+" : "+str(item2.getComplejidad())
			gr.add_edge((valor1, valor2), href="/")
	
	gr.layout()
	gr.draw('alpha/static/grafos/grafo_item.jpg')
	archivo= open('alpha/static/grafos/grafo_item.jpg','rb')
	contenido= archivo.read()
	archivo.close()
	return Response(contenido)


def grafo_calcular_impacto_delante(request):
	session = DBSession()
	lista= []
	idProyecto = int(request.matchdict['idProyecto'])
	costo= request.matchdict['impacto']
	proyecto= session.query(Proyecto).filter_by(id = idProyecto).first()
	##
	# eje x
	proyecto.fases.sort(comparaFase)
	desplazamiento_x = {}
	__index = 0
	for i in proyecto.fases:
		desplazamiento_x[i.id] = __index
		__index+=1
	# eje y
	desplazamiento_y = []
	for i in range(len(proyecto.fases)):
		desplazamiento_y.append(0)
	
	#####
	gr = pgv.AGraph(label= "Costo del impacto: "+ str(costo),directed=True)
	#gr.node_attr['shape']='circle'
	nodos= []
	id_nodos= []
	for fas in proyecto.fases:
		fas.items.sort(compara)
		for nodo in fas.items:
			if nodo.getEstado() != 'Eliminado':
				id_nodos.append(nodo.id)
				nodos.append(nodo)
	
	for nodo in nodos:
		item = nodo
		valor = str(item.id)+" : "+str(item.getComplejidad())
		index = desplazamiento_x[item.fase_id]
		posicion =  str(index*3.5)+','+str(90-desplazamiento_y[index]*2)
		desplazamiento_y[index] = desplazamiento_y[index] + 1
		color= 'white'
		if item.getMarcado() == 'Si':
			color= '#CD661D'
		gr.add_node(valor, label= item.getNombre()+" : "+  str(item.getComplejidad()), fillcolor=color, style="filled", pos=posicion, pin=True)
	#relaciones son aristas
	#relaciones antecesor-sucesor
	aristas = session.query(RelacionSucesor).filter(RelacionSucesor.left_id.in_(id_nodos)).filter(RelacionSucesor.right_id.in_(id_nodos)).all()
	# relaciones padre-hijo
	aristasAdd= session.query(RelacionHijo).filter(RelacionHijo.left_id.in_(id_nodos)).filter(RelacionHijo.right_id.in_(id_nodos)).all()
	#concatena todas las relaciones
	aristas.extend(aristasAdd)
	for arista in aristas:
		if(gr.has_edge((arista.left_id, arista.right_id))==False):
			item1 = item = DBSession.query(Item).get(arista.left_id)
			item2 = item = DBSession.query(Item).get(arista.right_id)
			valor1 = str(item1.id)+" : "+str(item1.getComplejidad())
			valor2 = str(item2.id)+" : "+str(item2.getComplejidad())
			gr.add_edge((valor1, valor2), href="/")
	
	gr.layout()
	gr.draw('alpha/static/grafos/grafo_item.png')
	archivo= open('alpha/static/grafos/grafo_item.png','rb')
	contenido= archivo.read()
	archivo.close()
	return Response(contenido)


def grafo_linea_base(request):
	session = DBSession()
	lista= []
	idProyecto = int(request.matchdict['idProyecto'])
	costo= request.matchdict['impacto']
	proyecto= session.query(Proyecto).filter_by(id = idProyecto).first()
	##
	# eje x
	proyecto.fases.sort(comparaFase)
	desplazamiento_x = {}
	__index = 0
	for i in proyecto.fases:
		desplazamiento_x[i.id] = __index
		__index+=1
	# eje y
	desplazamiento_y = []
	for i in range(len(proyecto.fases)):
		desplazamiento_y.append(0)
	
	#####
	gr = pgv.AGraph(label= "Costo de la Linea Base: "+ str(costo),directed=True)
	#gr.node_attr['shape']='circle'
	nodos= []
	id_nodos= []
	for fas in proyecto.fases:
		fas.items.sort(compara)
		for nodo in fas.items:
			if nodo.getEstado() != 'Eliminado':
				id_nodos.append(nodo.id)
				nodos.append(nodo)
	
	for nodo in nodos:
		item = nodo
		valor = str(item.id)+" : "+str(item.getComplejidad())
		index = desplazamiento_x[item.fase_id]
		posicion =  str(index*3.5)+','+str(90-desplazamiento_y[index]*2)
		desplazamiento_y[index] = desplazamiento_y[index] + 1
		color= 'white'
		if item.getMarcado() == 'Si':
			color= '#708090'
		gr.add_node(valor, label= item.getNombre()+" : "+  str(item.getComplejidad()), fillcolor=color, style="filled", pos=posicion, pin=True)
	#relaciones son aristas
	#relaciones antecesor-sucesor
	aristas = session.query(RelacionSucesor).filter(RelacionSucesor.left_id.in_(id_nodos)).filter(RelacionSucesor.right_id.in_(id_nodos)).all()
	# relaciones padre-hijo
	aristasAdd= session.query(RelacionHijo).filter(RelacionHijo.left_id.in_(id_nodos)).filter(RelacionHijo.right_id.in_(id_nodos)).all()
	#concatena todas las relaciones
	aristas.extend(aristasAdd)
	for arista in aristas:
		if(gr.has_edge((arista.left_id, arista.right_id))==False):
			item1 = item = DBSession.query(Item).get(arista.left_id)
			item2 = item = DBSession.query(Item).get(arista.right_id)
			valor1 = str(item1.id)+" : "+str(item1.getComplejidad())
			valor2 = str(item2.id)+" : "+str(item2.getComplejidad())
			gr.add_edge((valor1, valor2), href="/")
	
	gr.layout()
	gr.draw('alpha/static/grafos/grafo_item.png')
	archivo= open('alpha/static/grafos/grafo_item.png','rb')
	contenido= archivo.read()
	archivo.close()
	return Response(contenido)
